package collection;

import java.util.ArrayList;
import java.util.List;

/**
 * @author xiaoming
 * @version 1.0
 * @date 2019-03-04 20:14
 * 6.5 集合与泛型
 * 加菲猫, 猫,动物
 * 说明extend和super的差异
 **/
public class AnimalCatarfield {
    public static void main(String[] args) {
        // 1. 申明三个依次继承的泪的集合
        List<Animal> animal = new ArrayList<Animal>();
        List<Cat> cat = new ArrayList<Cat>();
        List<Garfield> garfield = new ArrayList<Garfield>();

        animal.add(new Animal());
        cat.add(new Cat());
        garfield.add(new Garfield());

        // 2. 测试赋值操作
        // 编译出错, 只能赋值Cat 或者其子类
//        List<? extends Cat> extendsCatFromAnimal = animal;
        // ok
        List<? super Cat> superCatFromAnimal = animal;

        // ok
        List<? extends Cat> extendsCatFromCat = cat;
        List<? super Cat> superCatFromCat = cat;

        List<? extends Cat> extendsCatFromGarfield = garfield;
        // 编译出错, 只能赋值Cat 或其父类的集合
//        List<? super Cat> superCatFromGarfield = garfield;

        // 3. 测试add()
        // 下面三行中所有的<? extends T> 都无法进行add操作, 编译出错
//        extendsCatFromCat.add(new Animal());
//        extendsCatFromCat.add(new Cat());
//        extendsCatFromCat.add(new Garfield());

        // 下行编译出错, 只能添加Cat 或者其子类的集合
//        superCatFromCat.add(new Animal());
        // ok
        superCatFromCat.add(new Cat());
        superCatFromCat.add(new Garfield());

        // 4. 测试get()
        // 所有super操作能够返回元素, 但是泛型丢失, 返回Object

        // extends
        Object catExtends2 = extendsCatFromCat.get(0);
        Cat catExtends1 = extendsCatFromCat.get(0);
        // 下行编译出错, 虽然Cat集合从Garfield赋值而来
        // 但是类型擦出后, 不知道是什么类型
//        Garfield garfield1 = extendsCatFromGarfield.get(0);
        // ok
        Cat garfield1 = extendsCatFromGarfield.get(0);

    }

    static class Animal extends Object {
    }

    static class Cat extends Animal {
    }

    static class Garfield extends Cat {
    }

}
